// 引入路由器对象 router
import router from './router'
// 引入store对象(vuex中的对象)
import store from './store'
// 引入element-ui组件库中的 消息组件对象
import {
  Message
} from 'element-ui'
// 引入进度条
import NProgress from 'nprogress' // progress bar
// 引入进度条的样式文件
import 'nprogress/nprogress.css' // progress bar style
// 引入获取token的回调函数
import {
  getToken
} from '@/utils/auth' // get token from cookie
// 引入拼接页面标题的函数(该函数是需要传入路由地址对应的标题名字的)
import getPageTitle from '@/utils/get-page-title'
// 设置进度条中的  进度环  的显示隐藏
NProgress.configure({
  showSpinner: false
}) // NProgress Configuration
// 白名单列表数据---数组 ,该名单中只有  /login 的路由地址
const whiteList = ['/login'] // no redirect whitelist
// 全局的前置路由守卫
router.beforeEach(async (to, from, next) => {
  // 开启进度条
  NProgress.start()
  // 设置页面的标题
  document.title = getPageTitle(to.meta.title)
  // 获取token数据
  const hasToken = getToken()
  // 判断token是否存在
  if (hasToken) {
    // 此时的token是存在,然后再判断是不是要向/login界面跳转,有token就是登录过了,既然如此就没有必要去/login界面,直接去 / 首页即可
    if (to.path === '/login') {
      next({
        path: '/'
      }) // 直接跳转到首页即可
      NProgress.done() // 关闭进度条
    } else {
      // 此时虽然后token(那么就是登录了),访问的不是/login
      // 有token不代表就是登录成功,有了token,而且还要有用户名字,才能说明是登录成功过
      // 获取用户名信息
      const hasGetUserInfo = store.getters.name
      // 判断用户名是否存在
      if (hasGetUserInfo) {
        // 此时有token,也有用户名字,那么就是想去哪就去哪(想跳转到哪个地址就可以随心所欲)
        next()
      } else {
        // 此时有token,但是没有用户名
        try {
          // 分发action,用来获取用户名字
          await store.dispatch('user/getInfo')
          // 有token,用户名字也获取成功了,那么也是想去哪里就去哪里
          // 解决的是路由重新跳转的时候所产生的白板的bug
          // to--->目标路由对象
          next({
            ...to
          })

        } catch (error) {
          // 此时获取用户名字信息失败,也就意味着此时的token是无效果的,如:token过期了
          // 分发重置token的action,所有的token,包括用户的信息全部的重置
          await store.dispatch('user/resetToken')
          // 页面中提示获取用户失败的信息
          Message.error(error || 'Has Error')
          // 让页面重新的跳转到登录界面
          next(`/login?redirect=${to.path}`)
          NProgress.done() // 关闭进度条
        }
      }
    }
  } else {
    // 此时没有token数据,推断出:没有登录过,那么访问的还是登录界面,当然要放行了
    if (whiteList.indexOf(to.path) !== -1) {
      // 判断目标路由地址是不是登录的地址(/login),此时没有token,而且还是登录的界面,那么就放行
      next()
    } else {
      // 没有token,还想访问其他的页面,那是不行,让你直接跳转到/login的界面,进行登录
      next(`/login?redirect=${to.path}`)
      // 关闭进度条
      NProgress.done()
    }
  }
})
// 全局的后置路由守卫
router.afterEach(() => {
  // 关闭进度条
  NProgress.done()
})
